﻿#pragma once
#include<stdlib.h>
#include<string.h>
#include<locale.h>
#include<stdio.h>
#include<wchar.h>
#include<time.h>
#include<stdbool.h>
#include<Windows.h>

//相关图标的设定：
#define WALL L'□'
#define BODY L'●'
#define FOOD L'◆'

//重要坐标的信息设置：
#define Pos_X 24
#define Pos_Y 5

//定义按键宏：
//KEY_PRESS用来检测vk虚拟键值所对应的按键是否被按过：
#define KEY_PRESS(vk) (GetAsyncKeyState(vk)&1)
//PRESS_KEY用来检测vk虚拟键值所对应的按键是否被按下：
#define PRESS_KEY(vk) (GetAsyncKeyState(vk)&0x8000)

//定义W，S，A，D虚拟键值常数
#define VK_W 0x57
#define VK_S 0x53
#define VK_A 0x41
#define VK_D 0x44

enum DIRECTION
{
	Up = 1,
	Down,  
	Left,
	Right
};

enum GAMESTATUS
{
	Ok,         //游戏正常运行
	End_Normal, //游戏正常退出
	End_By_Wall,//蛇撞墙而死
	End_By_Self, //蛇自杀而死
	Pause
};

//链表节点表示蛇身：
typedef struct SnackNode {
	int x;
	int y;
	struct SnackNode* next;
}SnackNode;

typedef struct Snack {
	SnackNode* pSnack;     //指向蛇头的指针，对于单链表而言，有了蛇头就有了整个蛇身
	SnackNode* foodNode;   //表示食物的指针
	int score;             //用于表示得分  
	int foodWeight;        //食物权重，一个食物的得分
	int speed;             //蛇的速度
	enum DIRECTION dir;    //蛇的前进方向
	enum GAMESTATUS status;//游戏的运行状态
}Snack;

//相关函数的声明：
void WelcomeToGame(Snack* ps);
void GameStart(Snack* ps);
void GameRun(Snack* ps);
void GameEnd(Snack* ps);